package com.fdb.efp.nls.service.impl.bd;

import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.efp.nls.service.facade.bd.BdMoneyDrawBatchService;
import com.fdb.efp.nls.service.util.DueDataUtil;
import com.fdb.efp.nls.service.facade.AccLoanService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.facade.BdMoneyDrawService;
import com.fdb.efp.nls.service.facade.BdMoneyDrawTempService;
import com.fdb.efp.nls.service.vo.AccLoanVO;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.vo.BdMoneyDrawTempVO;
import com.fdb.efp.nls.service.vo.BdMoneyDrawVO;
import com.fdb.efp.nls.service.facade.BdLoanpayService;
import com.fdb.efp.nls.service.facade.NlsApplyInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据百度同步过来的百度托管机构资金划扣明细临时表数据修改托管机构资金划扣明细表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午5:24:25
 * @version 1.0
 */
@Service("bdMoneyDrawBatchService")
public class BdMoneyDrawBatchServiceImpl implements BdMoneyDrawBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdMoneyDrawBatchServiceImpl.class);

	@Autowired
	@Qualifier("bdMoneyDrawTempService")
	private BdMoneyDrawTempService bdMoneyDrawTempService;// 托管机构资金划扣明细临时信息

	@Autowired
	@Qualifier("bdMoneyDrawService")
	private BdMoneyDrawService bdMoneyDrawService;// 托管机构资金划扣明细信息

	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;// 借据信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	// @Autowired
	// @Qualifier("bdDnDetailTempService")
	// private BdDnDetailTempService bdDnDetailTempService;// 放款明细临时信息
	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;// 百度放款通知记录信息

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	/**
	 * 
	 * 根据百度同步过来的百度托管机构资金划扣明细临时表数据修改托管机构资金划扣明细表 <br>
	 * 0.1:ludayong:2019年3月7日 下午3:17:41:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月7日 下午5:26:01
	 * @date 2019年3月7日 下午5:26:01
	 * @version 0.1
	 */
	@Override
	public boolean batchUpdateMoneyDraw() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度托管机构资金划扣明细临时数据到百度托管机构资金划扣明细表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 单位转换
			final BigDecimal oneHundred = new BigDecimal(100);
			// 新增或者修改的托管机构资金划扣明细信息
			List<BdMoneyDrawTempVO> list = null;
			// 分页信息
			BdMoneyDrawTempVO pageInfo = new BdMoneyDrawTempVO();
			// 新增或者修改的托管机构资金划扣明细信息数量
			int num = 0;
			// 页数
			int page = 1;
			// pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 判断循环次数
			int size = bdMoneyDrawTempService.queryCount();
			String size_msg = "【托管机构资金划扣明细临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;
			// 放款信息
			// BdDnDetailTempVO inBdDnDetailTempVO = new BdDnDetailTempVO();
			// 百度放款通知记录信息
			// BdLoanpayVO inBdLoanpayVO = new BdLoanpayVO();
			// 网贷申请基本信息
			// NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
			// 借据信息
			AccLoanVO inAccLoanVO = new AccLoanVO();
			// 借据号
			String bdLoanId = null;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【托管机构资金划扣明细临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 分页查询【托管机构资金划扣明细表】数据
				List<BdMoneyDrawTempVO> tempList = bdMoneyDrawTempService.queryByPage(pageInfo);
				list = new ArrayList<BdMoneyDrawTempVO>();
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					for (BdMoneyDrawTempVO bdMoneyDrawTemVO : tempList) {
						bdLoanId = bdMoneyDrawTemVO.getLoanId();
						// 放款明细入参
						// inBdDnDetailTempVO.setLoanId(bdLoanId);
						// 查询的放款信息
						// BdDnDetailTempVO queryBdDnDetailTempVO =
						// bdDnDetailTempService.queryByPk(inBdDnDetailTempVO);
						// 百度放款通知记录信息
						// inBdLoanpayVO.setLoanId(bdLoanId);
						// 查询百度放款通知记录信息
						// BdLoanpayVO queryBdLoanpayVO = bdLoanpayService.queryByPk(inBdLoanpayVO);
						// String orderId = "";
						// if (Objects.nonNull(queryBdLoanpayVO)) {
						// // 订单号
						// orderId = queryBdLoanpayVO.getOrderId();
						// } else {
						// String tableName = "bd_loanpay";
						// String errorMsg = "未查询到托管机构资金划扣明细临时信息关联的百度放款通知记录信息，借据号：" + bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// 网贷用信申请流水号
						// String applySeq = "";
						// 订单号非空
						// if (!StringUtil.isNullorBank(orderId)) {
						// // 订单号
						// inNlsApplyInfoVO.setBdOrderId(orderId);
						// // 查询的网贷申请基本信息
						// NlsApplyInfoVO queryNlsApplyInfoVO =
						// nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
						// if (Objects.nonNull(queryNlsApplyInfoVO)) {
						// // 网贷用信申请流水号
						// applySeq = queryNlsApplyInfoVO.getApplySeq();
						// } else {
						// String tableName = "nls_apply_info";
						// String errorMsg = "未查询到托管机构资金划扣明细临时信息关联的网贷申请基本信息，放款订单号：" + orderId + "，借据号："
						// + bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// }
						// 网贷用信申请流水号非空
						// if (!StringUtil.isNullorBank(applySeq)) {
						// 设置借据号
						inAccLoanVO.setBillNo(bdMoneyDrawTemVO.getLoanId());
						AccLoanVO queryAccLoanVo = accLoanService.queryByPk(inAccLoanVO);
						if (Objects.nonNull(queryAccLoanVo)) {
							// 设置新的借据号
							// bdMoneyDrawTemVO.setLoanId(loanId);
							BigDecimal transAmount = bdMoneyDrawTemVO.getTransAmount();
							if (Objects.nonNull(transAmount)) {
								// 交易金额单位转换
								bdMoneyDrawTemVO.setTransAmount(transAmount.divide(oneHundred));
							}
							// cur_date 账务日期
							bdMoneyDrawTemVO.setCurDate(DueDataUtil.dateInfoTrans(bdMoneyDrawTemVO.getCurDate()));
							// start_date 发起日期
							bdMoneyDrawTemVO.setStartDate(DueDataUtil.dateInfoTrans(bdMoneyDrawTemVO.getStartDate()));
							// apply_date 回调日期
							bdMoneyDrawTemVO.setApplyDate(DueDataUtil.dateInfoTrans(bdMoneyDrawTemVO.getApplyDate()));
							// partner_cur_date 合作机构资金划拨账务日期 String(8) 合作机构资金划拨账务日期
							bdMoneyDrawTemVO.setPartnerCurDate(DueDataUtil.dateInfoTrans(bdMoneyDrawTemVO.getPartnerCurDate()));
							// 新增或者修改的托管机构资金划扣明细信息
							list.add(bdMoneyDrawTemVO);
						} else {
							String tableName = "acc_loan";
							String errorMsg = "未查询到托管机构资金划扣明细临时信息关联的借据信息，借据号：" + bdLoanId;
							addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
							logger.error(errorMsg);
						}
						// }
					}
					// 新增或者修改的托管机构资金划扣明细信息
					if (Objects.nonNull(list) && !list.isEmpty()) {
						int updateSize = bdMoneyDrawService.insertOrUpdateBdMoneyDraw(list);
						num += updateSize;
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【托管机构资金划扣明细表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_money_draw";
			String errorMsg = "同步百度托管机构资金划扣明细临时数据到百度托管机构资金划扣明细表出错";
			String remark = "同步百度托管机构资金划扣明细临时数据到百度托管机构资金划扣明细表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度托管机构资金划扣明细临时数据到百度托管机构资金划扣明细表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度托管机构资金划扣明细临时数据到百度托管机构资金划扣明细表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据百度托管机构资金划扣明细临时信息的借据号查询百度托管机构资金划扣明细正式表信息是否存在 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public boolean queryBdMoneyDrawInfo(BdMoneyDrawTempVO bdMoneyDrawTempVO) {
		boolean isExit = false;
		BdMoneyDrawVO inBdMoneyDrawVO = new BdMoneyDrawVO();
		if (Objects.nonNull(bdMoneyDrawTempVO)) {
			inBdMoneyDrawVO.setOrderId(bdMoneyDrawTempVO.getOrderId());
			// 查询百度托管机构资金划扣明细正式表信息是否存在
			BdMoneyDrawVO queryBdMoneyDrawVO = bdMoneyDrawService.queryByPk(inBdMoneyDrawVO);
			if (Objects.nonNull(queryBdMoneyDrawVO)) {
				isExit = true;
			}
		}
		return isExit;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
